import pymysql
import logging
import os
import pymysql
import configparser

# 配置日志
logging.basicConfig(
    level=logging.INFO,
    format='%(asctime)s - %(levelname)s - %(message)s'
)

class DBUtils:
    """
    数据库工具类，提供通用的数据库连接和操作功能
    """
    _instance = None
    _config = None
    
    def __new__(cls):
        """单例模式，确保全局只有一个DBUtils实例"""
        if cls._instance is None:
            cls._instance = super(DBUtils, cls).__new__(cls)
            cls._instance._load_config()
        return cls._instance
    
    def _load_config(self):
        """加载数据库配置"""
        if self._config is None:
            try:
                config_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'config.properties')
                
                if os.path.exists(config_path):
                    # 直接读取键值对格式的配置文件
                    config = {}
                    with open(config_path, 'r', encoding='utf-8') as f:
                        for line in f:
                            line = line.strip()
                            # 跳过注释行和空行
                            if line and not line.startswith('#') and '=' in line:
                                key, value = line.split('=', 1)
                                config[key.strip()] = value.strip()
                    
                    # 提取数据库配置
                    self._config = {
                        'host': config.get('db.host', 'localhost'),
                        'port': int(config.get('db.port', '3306')),
                        'user': config.get('db.user', 'root'),
                        'password': config.get('db.password', ''),
                        'default_db': config.get('db.name', 'lqetl'),
                        'charset': 'utf8mb4'
                    }
                    logging.info("成功加载数据库配置")
                else:
                    # 如果配置文件不存在，使用默认值或DataBiz中的硬编码值
                    self._config = {
                        'host': 'rm-wz947iu1197mgn965xo.mysql.rds.aliyuncs.com',
                        'port': 3306,
                        'user': 'etluser',
                        'password': 'Lq@88888',
                        'default_db': 'lqetl',
                        'charset': 'utf8mb4'
                    }
                    logging.warning("配置文件不存在，使用默认数据库配置")
            except Exception as e:
                logging.error(f"加载数据库配置失败: {str(e)}")
                # 加载失败时使用硬编码的默认值
                self._config = {
                    'host': 'localhost',
                    'port': 3306,
                    'user': 'root',
                    'password': '',
                    'default_db': 'lqetl',
                    'charset': 'utf8mb4'
                }
    
    def get_db_connection(self, db_name=None):
        """
        获取数据库连接和游标
        
        参数:
            db_name: 数据库名称，如果为None则使用配置文件中的默认数据库
            
        返回:
            tuple: (connection, cursor) 数据库连接和游标对象
            
        异常:
            pymysql.MySQLError: 当数据库连接失败时抛出
        """
        try:
            if self._config is None:
                self._load_config()
                
            # 使用指定的数据库名或默认数据库名
            target_db = db_name if db_name else self._config['default_db']
            
            # 创建数据库连接
            conn = pymysql.connect(
                host=self._config['host'],
                port=self._config['port'],
                user=self._config['user'],
                password=self._config['password'],
                db=target_db,
                charset=self._config['charset'],
                autocommit=True
            )
            
            # 创建游标
            cursor = conn.cursor(pymysql.cursors.DictCursor)
            return conn, cursor
        except pymysql.MySQLError as e:
            logging.error(f"数据库连接失败: {str(e)}")
            raise

# 创建全局单例实例供其他模块直接使用
db_utils = DBUtils()